home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / net_des.arc / GETPASS.C < prev    next >
C/C++ Source or Header  |  1988-12-05  |  1KB  |  52 lines

  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <sgtty.h>
  4.  
  5. #ifdef    MSDOS
  6. #define    TTY    "con"
  7. #else
  8. #define    TTY    "/dev/tty"    /* Change to "con" for MS-DOS */
  9. #endif
  10.  
  11. /* Issue prompt and read reply with echo turned off */
  12. char *
  13. getpass(prompt)
  14. char *prompt;
  15. {
  16.     struct sgttyb ttyb,ttysav;
  17.     register char *cp;
  18.     int c;
  19.     FILE *tty;
  20.     static char pbuf[128];
  21.     int (*sig)();
  22.  
  23.     if ((tty = fdopen(open(TTY, 2), "r")) == NULL)
  24.         tty = stdin;
  25.     else
  26.         setbuf(tty, (char *)NULL);
  27.     sig = signal(SIGINT, SIG_IGN);
  28.     ioctl(fileno(tty), TIOCGETP, &ttyb);
  29.     ioctl(fileno(tty), TIOCGETP, &ttysav);
  30.     ttyb.sg_flags |= RAW;
  31.     ttyb.sg_flags &= ~ECHO;
  32.     ioctl(fileno(tty), TIOCSETP, &ttyb);
  33.     fprintf(stderr, "%s", prompt);
  34.     fflush(stderr);
  35.     cp = pbuf;
  36.     for (;;) {
  37.         c = getc(tty);
  38.         if(c == '\r' || c == '\n' || c == EOF)
  39.             break;
  40.         if (cp < &pbuf[127])
  41.             *cp++ = c;
  42.     }
  43.     *cp = '\0';
  44.     fprintf(stderr,"\r\n");
  45.     fflush(stderr);
  46.     ioctl(fileno(tty), TIOCSETP, &ttysav);
  47.     signal(SIGINT, sig);
  48.     if (tty != stdin)
  49.         fclose(tty);
  50.     return(pbuf);
  51. }
  52.